package main

import "fmt"

//p int(0x23242422) 表示 传递的是  int 类型的值
func changeValue(p int) {
	p = 100
}

//p *int(0x23242422) 表示 传递的是 指向一个 int 类型的地址(0x232432343) 而不是具体的值
func changeValueOfPointer(p *int) {
	*p = 100
}

//形参传值
func swap(a int, b int) {
	var temp int
	temp = a
	a = b
	b = temp
}

//形参传地址
func swapOfPointer(a *int, b *int) {
	var temp int
	fmt.Println(&temp) //0xc00000a110  temp 变量的内存地址
	temp = *a
	fmt.Println(&temp) //0xc00000a110 temp 变量的内存地址
	fmt.Println(temp)  //1 默认打印的就是内存地址中的内容 temp变量内存地址中存放的内容
	fmt.Println(&a)    //0xc000006030  a 变量的内存地址
	fmt.Println(&*a)   //0xc00000a0d8 a 变量内存地址中存放的内容
	fmt.Println(*a)    //1 a 内存地址中存放的内容 根据内容是地址类型 跳了一次 找到目标内存地址中的内容
	fmt.Println(a)     //0xc00000a0d8 默认打印的就是内存地址中的内容 a 变量内存地址中存放的内容(是个地址值)
	*a = *b
	*b = temp
}

func main() {
	var i1 = 1
	var i2 = 2
	swap(i1, i2)
	fmt.Printf("i1 i2 swap after is %d,%d \n", i1, i2)

	fmt.Println(&i1) //0xc00000a0d8
	swapOfPointer(&i1, &i2)
	fmt.Printf("*i1 *i2 swapOfPointer after is %d,%d \n", i1, i2)

	var po = 1
	changeValue(po)
	fmt.Printf("p changeValue is %d \n", po)

	//取出po(0x232432343)的地址传递给形参
	changeValueOfPointer(&po)
	fmt.Printf("*p changeValueOfPointer is %d \n", po)

	fmt.Println("===========")
	//一级指针
	var p *int
	p = &i1
	fmt.Println(&i1) //0xc00000a0d8
	//默认打印的就是内存地址中的内容 p->i1
	fmt.Println(p) //0xc00000a0d8
	//p 本身的内存地址
	fmt.Println(&p) //0xc000006038
	//*p 代表要取内容了
	fmt.Println(*p) //2

	//二级指针
	var pp **int
	pp = &p
	fmt.Println(&p) //0xc000006038
	//默认打印的就是内存地址中的内容
	fmt.Println(pp) //0xc000006038
	//*pp 代表要取pp的内容了(上级p的内存地址中存放的内容(i1的地址嘛))
	fmt.Println(*pp) //0xc00000a0d8
	//**pp 代表要取*(*pp)内容(上级p的内存地址的内存地址值的内容)
	fmt.Println(**pp) //2
}
